﻿using System.Collections.Generic;
using Wedn.Core.Common;
using Wedn.Core.Entity;

namespace Wedn.Core.Service
{
    /// <summary>
    /// 链接管理类
    /// </summary>
    public class LinkManager
    {
        private Wedn.Interface.DAL.ILink dao;

        /// <summary>
        /// 链接管理类构造函数
        /// </summary>
        /// <exception cref="未找到系统数据库访问组件"></exception>
        public LinkManager()
        {
            dao = Wedn.Interface.DAOFactory.CreateLinkDAOInstance();
            if (dao == null)
            {
                throw new System.Exception("缺失数据库访问组件!");
            }
            //LoadLink();
        }

        /// <summary>
        /// 向链接表中插入一行数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="link">要插入的对象</param>
        /// <returns>执行结果受影响行数</returns>
        public int Insert(Link link)
        {
            return dao.Insert(link);
        }

        /// <summary>
        /// 根据链接ID删除链接表对应的一条记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除记录的链接ID</param>
        /// <returns>执行结果受影响行数</returns>
        public int Delete(int id)
        {
            return dao.Delete(id);
        }

        /// <summary>
        /// 根据链接ID数组删除链接表对应的多条记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除记录的链接ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        public int Delete(int[] ids)
        {
            return dao.Delete(ids);
        }

        /// <summary>
        /// 更新一个完整链接对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="link">要更新的对象</param>
        /// <returns>执行结果受影响行数</returns> 
        public int UpdateLink(Link link)
        {
            return dao.UpdateLink(link);
        }

        /// <summary>
        /// 根据链接ID数组批量更新多个链接的父ID, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">链接ID数组</param>
        /// <param name="parentId">父ID(忽略则传入-1)</param>
        /// <param name="visible">更新的是否可见</param>
        /// <returns>执行结果受影响行数</returns>
        public int UpdateParentId(int[] ids, int parentId, bool visible)
        {
            int res = dao.UpdateParentId(ids, parentId, visible);
            return res;
        }

        /// <summary>
        /// 从数据库获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        public int GetMaxId()
        {
            return dao.SelectMaxId();
        }

        /// <summary>
        /// 选取链接总数
        /// </summary>
        /// <param name="where">选择条件(忽略则传入null)</param>
        /// <returns>总数</returns>
        public int GetLinksCount(string where)
        {
            return dao.SelectLinksCount(where);
        }

        /// <summary>
        /// 取出当前链接表中的所有链接信息, 返回所有链接信息集合, 如果不存在则返回空集合
        /// </summary>
        /// <returns>所有链接信息对象集合</returns>
        public List<Link> GetLinkList()
        {
            List<Link> list = dao.SelectLinkList();
            if (list == null)
                list = new List<Link>();
            return list;
        }

        /// <summary>
        /// 根据父ID,链接类型和是否启用选取链接对象集合, 返回链接信息对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <param name="type">链接类型</param>
        /// <param name="visible">是否是可用链接</param>
        /// <returns>链接信息对象集合</returns>
        public List<Link> GetLinkList(LinkType type, bool visible)
        {
            List<Link> list = dao.SelectLinkList((int)type, visible);
            if (list == null)
                list = new List<Link>();
            return list;
        }

        /// <summary>
        /// 根据父ID,链接类型和是否启用选取链接对象集合, 返回链接信息对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <param name="parentId">父ID</param>
        /// <param name="type">链接类型</param>
        /// <param name="visible">是否是可用链接</param>
        /// <returns>链接信息对象集合</returns>
        public List<Link> GetLinkList(int parentId, LinkType type, bool visible)
        {
            List<Link> list = dao.SelectLinkList(parentId, (int)type, visible);
            if (list == null)
                list = new List<Link>();
            return list;
        }

        /// <summary>
        /// 从数据库根据检索条件选取链接对象集合, 返回满足条件的链接对象集合, 如果不存在则返回空集合
        /// </summary>
        /// <param name="keyword">关键词(忽略则传入null)</param>
        /// <param name="parentId">父ID</param>
        /// <param name="type">链接类型</param>
        /// <param name="visible">是否是可用链接</param>
        /// <param name="pageSize">文章数目</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderField">排序字段</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))</param>
        /// <param name="recordCount">返回查询到的记录数量</param>
        /// <returns>满足条件的链接对象集合</returns>
        public List<Link> GetLinkList(string keyword, int parentId, LinkType type, bool visible, int pageSize, int pageIndex, string orderField, int order, out int recordCount)
        {
            List<Link> list = dao.SelectLinkList(keyword, parentId, (int)type, visible, pageSize, pageIndex, orderField, order, out recordCount);
            if (list == null)
                list = new List<Link>();
            return list;
        }

        /// <summary>
        /// 根据ID取出当前链接表中的链接对象, 如果不存在则返回null
        /// </summary>
        /// <returns>链接对象</returns>
        public Link GetLink(int id)
        {
            return dao.SelectLink(id);
        }
    }
}
